#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
/*
1、确定状态
2、状态转移方程
3、边界条件的确定
4、其他
*/

const int maxn = 1003;
int f[maxn][1003];
int cost[maxn];
int value[maxn];
int T,n;


int main()
{
    // cin>>T>>n;
    cin >> n >> T;
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        cin>>cost[i];
        cin>>value[i];
    }
    for(int j=1;j<=n;j++)  //对每种草药进行枚举
        for(int t=0;t<=T;t++){
            if(t<cost[j])  //当前的时间小于采这种草药的时间
            {
                f[j][t] = f[j-1][t];  //那么当前这种草药采药的价值，前一种草药用t时间采药的价值
            }
            else
            {
                //可以选择采药，也可以不选择采药，两者之间取最大
                //f[j][t] = max(f[j-1][t-cost[j]]+value[j], f[j-1][t]);
                f[j][t] = max(f[j][t-cost[j]]+value[j], f[j-1][t]);

            }
        }
    cout<<f[n][T]<<endl;
    return 0;
}